package com.blog.cmrpersonalblog.dto.comment.request;

import lombok.Data;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull;

/**
 * 评论树形结构查询请求DTO
 * 针对两层级评论系统优化：根评论 + 回复评论
 */
@Data
public class CommentTreeRequest {

    /**
     * 文章ID
     */
    @NotNull(message = "文章ID不能为空")
    private Long articleId;

    /**
     * 当前页码
     */
    @Min(value = 1, message = "当前页码不能小于1")
    private Long current = 1L;

    /**
     * 每页大小（根评论的数量）
     */
    @Min(value = 1, message = "每页大小不能小于1")
    private Long size = 10L;

    /**
     * 最大评论层级（固定为2层：顶级评论+一级回复）
     * 1: 只显示顶级评论
     * 2: 显示顶级评论+一级回复（推荐，固定值）
     */
    private final Integer maxLevel = 2;

    /**
     * 每个根评论下显示的回复数量限制
     * 默认显示5条，可通过"查看更多回复"展开
     */
    @Min(value = 0, message = "子评论数量限制不能小于0")
    private Integer childrenLimit = 5;

    /**
     * 排序类型：
     * 1: 最新优先（根评论按时间倒序，回复按时间正序）
     * 2: 最热优先（根评论按点赞数+评论数倒序）
     * 3: 时间正序（根评论和回复都按时间正序）
     */
    private Integer sortType = 1;

    /**
     * 扁平化显示所有回复（固定为true，强制扁平化）
     * 所有回复都平铺在顶级评论下，不支持多层嵌套
     */
    private final Boolean flatReplies = true;

    /**
     * 是否只加载根评论（不加载回复）
     * 用于首次加载时只显示根评论，回复通过单独接口懒加载
     */
    private Boolean rootOnly = false;

    /**
     * 回复排序方式：
     * 1: 时间正序（最早的回复在前）
     * 2: 时间倒序（最新的回复在前）  
     * 3: 点赞数倒序（最热回复在前）
     */
    private Integer replySortType = 1;

    /**
     * 内部使用：排序SQL片段
     */
    private String sortSql;

    /**
     * 内部使用：回复排序SQL片段  
     */
    private String replySortSql;

    /**
     * 应用排序类型，生成对应的SQL片段
     */
    public void applySortType() {
        if (this.sortType == null) {
            this.sortType = 1; // 默认最新
        }
        if (this.replySortType == null) {
            this.replySortType = 1; // 默认时间正序
        }

        // 根评论排序
        switch (this.sortType) {
            case 2: // 最热
                this.sortSql = "(c.like_count + c.reply_count * 0.5) DESC, c.create_time DESC";
                break;
            case 3: // 时间正序
                this.sortSql = "c.create_time ASC, c.id ASC";
                break;
            case 1: // 最新
            default:
                this.sortSql = "c.create_time DESC, c.id DESC";
                break;
        }

        // 回复排序
        switch (this.replySortType) {
            case 2: // 时间倒序
                this.replySortSql = "c.create_time DESC, c.id DESC";
                break;
            case 3: // 点赞数倒序
                this.replySortSql = "c.like_count DESC, c.create_time ASC, c.id ASC";
                break;
            case 1: // 时间正序
            default:
                this.replySortSql = "c.create_time ASC, c.id ASC";
                break;
        }
    }

    /**
     * 获取排序SQL片段（根评论用）
     */
    public String getSortSql() {
        if (this.sortSql == null) {
            applySortType();
        }
        return this.sortSql;
    }

    /**
     * 获取回复排序SQL片段
     */
    public String getReplySortSql() {
        if (this.replySortSql == null) {
            applySortType();
        }
        return this.replySortSql;
    }

    /**
     * 是否为两层级扁平化模式（固定返回true）
     * 系统强制使用两层级模式：顶级评论 + 一级回复
     */
    public boolean isTwoLevelMode() {
        return true;
    }
    
    /**
     * 获取最大层级（固定返回2）
     */
    public Integer getMaxLevel() {
        return maxLevel;
    }
    
    /**
     * 是否扁平化回复（固定返回true）
     */
    public Boolean getFlatReplies() {
        return flatReplies;
    }
}